スクリプト化されたルール
このセクション:
スクリプト化されたルール
スクリプト化されたルールを使用すると、カスタム ルールを Windows PowerShell スクリプトまたは VB スクリプトを使用して作成できるようになります。 スクリプトが成功か失敗かで、ルールの一部であるセキュリティ レベル、許可された項目、拒否された項目がユーザに適用されるかどうかが判定されます。
スクリプト化されたルールには、PowerShell または VBScript 経由でアクセスできる任意のインターフェイス (COM = コンポーネント オブジェクト モデルなど) を利用できます。
各スクリプトは、次の状況下で評価されます。
- 新しい構成がコンピュータに配布されたとき。
- ユーザがログオンしたとき。
スクリプトを作成または編集するには、アプリケーション制御 の構成エディタで、必要なスクリプト化されたルール セットに移動します。 ルールセット > スクリプト化 > [ルールセット名]
スクリプト化されたルール用の次のオプションを使用して、スクリプトの実行のタイミングを定義できます。
- スクリプトの実行:
- セッションごとにユーザとして実行 - ユーザがログオンするたびにスクリプトが実行されます。 設定は、ユーザ セッション中にのみ適用されます。
- セッションごとにシステムとして実行 - ユーザがログオンしたときに一度、システム アカウントの権限を使用してスクリプトが実行されます。 設定は、ユーザ セッション中にのみ適用されます。
- コンピュータごとにシステムとして実行 - コンピュータが起動されたときに一度、システム アカウントの権限を使用してスクリプトが実行されます。 コンピュータが再起動されるまで、アプリケーション制御 エージェントが再起動されるまで、または構成変更があるまで、すべてのユーザ セッションに対して設定が適用されます。
- ログオンが完了するまで待機 - ユーザ ログオンが完了するまでスクリプトが実行されないようにする場合に選択します。
注意: システム ユーザとしてスクリプトを実行すると、コンピュータに深刻な損害を与えるおそれがあります。上級スクリプト作成者のみが有効にしてください。
VBScript
各スクリプトがホストされたスクリプト エンジン内で実行されます。これにより、スクリプト実行の制御が大幅に向上する上、入出力の高度な制御が可能になります。
- VBS ファイルは使用しません。
- 別のプロセスが発生しません。
スクリプトは1つの関数として作成する必要があり、多数の関数を含めることができますが、メインの開始関数を指定しておく必要があります。 アプリケーション制御 エージェントが実行するのは開始関数で、この開始関数を使用して他の関数を呼び出せます。
AMScriptRule COM オブジェクトはスクリプト エンジンに組み込まれ、次のメソッドへのアクセスを提供します。
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
strStationname = AMScriptRule.WinStation
このインスタンスの Microsoft 標準では、WinStation が、ウィンドウ ステーション名 (通常は WinSta0) ではなく、セッションのタイプによって決まるターミナル サービス セッションの名前値 (通常は「Console」や「RDP-Tcp#34」) を返すことを意味します。
AMScriptRule COM オブジェクトには次のメソッドも含まれています。
strLog = AMScriptRule.Log "My Log Statement"
ロギング文字列をエージェントのログ ファイルに出力して、スクリプト化されたルールのデバッグに使用できるようにします。
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
スクリプトを実行しているユーザの環境変数を展開します。
WScript. シェルを使用して環境変数を展開すると、システム変数のみが返されます。
Windows PowerShell スクリプト
スクリプトが値0で戻った (終了した) 場合、スクリプトは合格であり、ルールが適用されます。 ゼロ以外の値が返された場合、スクリプトは失敗であり、ルールは適用されません。
各 PowerShell スクリプトは PowerShell.exe のインスタンス内で実行されるため、アプリケーション制御 が特定の構文を強制することも追加することもなく、正しい形式の PowerShell がすべて機能します。
PowerShell は、スクリプトを使用するすべてのエンドポイントにインストールされている必要があります。
サンプル スクリプト
次の VBScript は、ユーザがアクセスできるアプリケーションの制御方法を示しています。
Function ScriptedRule()
’Name of Filter scan expected to pass
ExpectedFilter = "FWALL"
’Get Server Name
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’Set initial return value
ScriptedRule = False
’Create MetaFrame Session Object
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’Initialize the session filters for this session
For Each x in MFSession.SmartAccessFilters
’return true if our filter is found
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
Next
End Function
次の VBScript を使用して、コンピュータがコンピュータ組織単位内にあるかどうかを判定できます。
Function ScriptedRule()
ScriptedRule = vbFalse
strCompName = AMScriptRule.StationName
Set oRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = oRootDSE.Get("DefaultNamingContext")
Set oOU = GetObject("LDAP://OU=TheOUyouAreSearching,OU=Parent,OU=Parent," & strDNSDomain)
oOU.GetInfo
For each member in oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
End Function
次のサンプル VBScript は、スクリプトのメイン コンポーネントを示しており、システムにログオンしているユーザのユーザ名に関する情報にアクセスし、特定のドメインおよび組織単位と突き合わせるための方法を例示しています。
Function MyScript()
'Get the username of the user logging in (also works when running as SYSTEM)
strUserName = AMScriptRule.UserName
'Get the domain of the user logging in (also works when running as SYSTEM)
strUserDomain = AMScriptRule.UserDomain
'Look up user environment variables (when running as SYSTEM, only SYSTEM variables are available)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'Log the output
AMScriptRule.Log strUserName & " logged in on " & strClientName
'Check if the user is a member of the domain
If strUserdomain = "MyDomain" Then
'If so, see if the user is in the MyOU OU
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
For Each objUser In objOU
'Check if there is a match with the user logging on
If objUser.sAMAccountName = strUserName Then
'if there is, then set the function to True
MyScript = True
End If
Next
End If
'Unless there is a username match, the function defaults to False
End Function
次のサンプル Windows PowerShell スクリプトは、スクリプトのメイン コンポーネントを示しており、システムにログオンしているユーザのユーザ名に関する情報にアクセスし、特定のドメインおよび組織単位と突き合わせるための方法を例示しています。
#Script checks if the current user is a member of the OU specified
# Return 0 if TRUE
# 1 otherwise
$logonuser = $env:username
$bindpt = [adsi] "LDAP://OU=TS_Users,OU=Users,OU=MyUser,OU=MyOU,DC=MyDomain,DC=com"
$users = New-Object System.DirectoryServices.DirectorySearcher $bindpt
$users.Filter = "(&(objectClass=User)(sAMAccountName=$logonuser))"
$obj = $users.FindOne()
if($obj -eq $null)
{
#" Not a Member"
exit 1
}